const fs = require('fs').promises;  // 引入Node.js的文件系统模块，使用Promise API
const path = require('path');       // 引入Node.js的路径模块

/**
 * 文件夹名提取器类，用于扫描指定目录中的文件夹，并提取文件夹名开头的【】中的内容。
 */
class JavNumScanner {
    /**
     * 构造函数，初始化根目录路径。
     * 
     * @param {string} rootDir - 要扫描的根目录路径
     */
    constructor(rootDir) {
        this.rootDir = rootDir;
    }

    /**
     * 扫描根目录，并返回符合条件的文件夹信息。
     * 
     * @returns {Promise<Array>} - 返回包含文件夹名称及提取结果的数组
     */
    async scan() {
        const results = [];
        await this.scanDirectory(this.rootDir, results);
        return results;
    }

    /**
     * 扫描指定目录，提取文件夹名称开头的【】中的内容。
     * 
     * @param {string} dir - 要扫描的目录路径
     * @param {Array} results - 保存扫描结果的数组
     * @returns {Promise<void>} - 返回一个Promise，当目录扫描完成时解决
     */
    async scanDirectory(dir, results) {
        const entries = await fs.readdir(dir, { withFileTypes: true });  // 读取目录内容

        for (const entry of entries) {
            const fullPath = path.join(dir, entry.name);  // 获取当前条目的完整路径

            if (entry.isDirectory()) {  // 只处理文件夹
                const extractedContent = this.extractContent(entry.name);  // 从文件夹名称中提取内容

                // 仅当提取到内容时，将扫描结果存入数组
                if (extractedContent) {
                    results.push({
                        folderName: entry.name,
                        path: fullPath,
                        extracted: extractedContent  // 提取到的内容
                    });
                }
            }
        }
    }

    /**
     * 从文件夹名称中提取开头的【】中的内容。
     * 
     * @param {string} folderName - 当前文件夹名称
     * @returns {string|null} - 返回提取的内容，如果不匹配则返回null
     */
    extractContent(folderName) {
        const match = folderName.match(/^【(.+?)】/);  // 使用正则表达式匹配开头的【】中的内容
        return match ? match[1] : null;  // 如果匹配成功，返回匹配内容，否则返回null
    }
}

module.exports = JavNumScanner;  // 导出JavNumScanner类
